# -*- coding: utf-8 -*-
"""
@Time ： 2023/10/23 8:46
@Auth ： y.h
@File ：main.py
@IDE ：PyCharm
@Motto：The sooner you start to code, the longer the program will take. —— Roy Carlson
"""

import time

import pandas

from openpyxl import load_workbook

from pythonProjectTemplate.Controller.file_controller import 文件操作
from pythonProjectTemplate.Controller.pandas_query_controller import pandas数据筛查
from pythonProjectTemplate.Controller.pandas_data_controller import 数据操作
from pythonProjectTemplate.Controller.configurator_controller import 配置器
from pythonProjectTemplate.Controller.numpy_calculation_controller import 矩阵运算


def main_1():
    # 文件读取----->>>>>>>>  开始
    start_time = time.time()
    表单配置列表 = []
    set_excel_properties_1 = (配置器().读取Excel表单配置()
                              .配置表单名("BOM清单")
                              .跳过指定的行(1)
                              .配置读取前几行(None)
                              .配置读取的列(None))

    set_excel_properties_2 = (配置器().读取Excel表单配置()
                              .配置表单名("价格清单")
                              .跳过指定的行(None)
                              .配置读取前几行(None)
                              .配置读取的列(None))

    set_excel_properties_3 = (配置器().读取Excel表单配置()
                              .配置表单名("生产计划")
                              )

    表单配置列表.append(set_excel_properties_1)
    表单配置列表.append(set_excel_properties_2)
    表单配置列表.append(set_excel_properties_3)

    文件地址 = r"C:\Users\31951\Desktop\小组五_Python编程竞赛_最终代码\数据文件夹\技能大赛Python决赛数据集.xlsx"

    file = 配置器().文件加载配置().配置Excel文件(文件地址, 表单配置列表)

    源数据 = 文件操作().pandas加载Excel(file)

    bom清单 = 源数据.get("技能大赛Python决赛数据集").get("BOM清单")
    价格清单 = 源数据.get("技能大赛Python决赛数据集").get("价格清单")
    生产计划 = 源数据.get("技能大赛Python决赛数据集").get("生产计划")

    # 数据查重 ---->>>>>>>>>>>>>>  开始

    外购 = pandas数据筛查().指定列值筛查(bom清单, "外购/内作", ["外购"])



    最低价格 = 价格清单.groupby('零件编号')['零件价格'].min().reset_index()



    生产计划分组求和 = 生产计划.groupby("车型派生代码")["生产台数"].sum()




    result = pandas数据筛查().合并表([外购, 最低价格], ["零件编号"], link_func="inner")


    多列运算配置 = (配置器().多列运算配置()
                    .配置数据集(result)
                    .配置文件名("技能大赛Python数据集")
                    .配置表名("BOM清单")
                    #   [{"key":"value"},....]  SZHBG-2023_multiply_零件价格1
                    .配置第一个参数(["SZHBG-2023",
                                     "SZHBG-2024",
                                     "SZHBG-2025",
                                     "SZHBG-2026",
                                     "SZHBG-2027",
                                     "SZHBG-2028",
                                     "SZHBG-2029",
                                     "SZHBG-2030",
                                     "SZHBG-2031",
                                     "SZHBG-2032",
                                     "SZHBG-2033",
                                     "SZHBG-2034",
                                     "SZHBG-2035",
                                     "SZHBG-2036",
                                     "SZHBG-2037",
                                     "SZHBG-2038",
                                     "SZHBG-2039",
                                     "SZHBG-2040",
                                     ])
                    .配置第二个参数(["零件价格"])
                    .配置运算符(配置器().运算符().乘))

    result = 数据操作().多列运算(多列运算配置)


    sheet_properties = 配置器().数据裁切配置().配置数据裁切起始列(24).配置数据裁切截止列(42).配置数据裁切截止行(10013)

    result = pandas数据筛查().数据截取(result, sheet_properties)

    result = 数据操作().指定行或列求和(result, 0, 18, "", flag=False)

    数据截取配置文件 = (配置器().数据裁切配置()
                        .配置行索引([10013]))
    数据截取后文件 = pandas数据筛查().数据截取(result, 数据截取配置文件)

    列名配置文件 = (配置器().更改列名配置().配置新列名(["SZHBG-2023",
                                                        "SZHBG-2024",
                                                        "SZHBG-2025",
                                                        "SZHBG-2026",
                                                        "SZHBG-2027",
                                                        "SZHBG-2028",
                                                        "SZHBG-2029",
                                                        "SZHBG-2030",
                                                        "SZHBG-2031",
                                                        "SZHBG-2032",
                                                        "SZHBG-2033",
                                                        "SZHBG-2034",
                                                        "SZHBG-2035",
                                                        "SZHBG-2036",
                                                        "SZHBG-2037",
                                                        "SZHBG-2038",
                                                        "SZHBG-2039",
                                                        "SZHBG-2040",
                                                        ])
                    .配置老列名(['SZHBG-2023_multiply_零件价格',
                                 'SZHBG-2024_multiply_零件价格', 'SZHBG-2025_multiply_零件价格',
                                 'SZHBG-2026_multiply_零件价格', 'SZHBG-2027_multiply_零件价格',
                                 'SZHBG-2028_multiply_零件价格', 'SZHBG-2029_multiply_零件价格',
                                 'SZHBG-2030_multiply_零件价格', 'SZHBG-2031_multiply_零件价格',
                                 'SZHBG-2032_multiply_零件价格', 'SZHBG-2033_multiply_零件价格',
                                 'SZHBG-2034_multiply_零件价格', 'SZHBG-2035_multiply_零件价格',
                                 'SZHBG-2036_multiply_零件价格', 'SZHBG-2037_multiply_零件价格',
                                 'SZHBG-2038_multiply_零件价格', 'SZHBG-2039_multiply_零件价格',
                                 'SZHBG-2040_multiply_零件价格']))

    result = 数据操作().修改列名(数据截取后文件, 列名配置文件)

    行列转换后结果 = 数据操作().行列转换(result)
    行列转换后结果 = 数据操作().重置索引列(行列转换后结果)

    列名配置文件 = (配置器().更改列名配置().配置新列名(["车型派生代码"])
                    .配置老列名(["index"]))

    result = 数据操作().修改列名(行列转换后结果, 列名配置文件)

    表合并后数据 = pandas数据筛查().合并表([生产计划分组求和,
                                            result],
                                           ["车型派生代码"],
                                           "inner")

    多列运算配置 = (配置器().多列运算配置()
                    .配置数据集(表合并后数据)

                    #   [{"key":"value"},....]  SZHBG-2023_multiply_零件价格1
                    .配置第一个参数(["生产台数"])
                    .配置第二个参数(["col_result"])
                    .配置运算符(配置器().运算符().乘))

    result = 数据操作().多列运算(多列运算配置)


    result = 数据操作().指定行或列求和(result, 3, 4, "", flag=False)

    result = result.iloc[18, 0]

    end_time = time.time()
    print(f"程序计算用时: {end_time - start_time}")
    print(f"最终结果: {result}")

    book = load_workbook(
        r"C:\Users\31951\Desktop\小组五_Python编程竞赛_最终代码\数据文件夹\技能大赛Python决赛数据集.xlsx")
    ws3 = book["题目"]
    ws3["E14"] = result

    book.save(r"C:\Users\31951\Desktop\小组五_Python编程竞赛_最终代码\数据文件夹\技能大赛Python决赛数据集.xlsx")




if __name__ == '__main__':
    main_1()
